package com.example.service;

import com.example.constants.MATLABConstants;
import Getfdfeatures.Getfdfeatures;
import com.example.exception.CustomException;
import com.example.utils.OSSUtil;
import com.example.utils.ScriptUtil;
import com.example.utils.TempFileUtil;
import org.dromara.x.file.storage.core.FileStorageService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;

/**
 * TODO .nii文件的相关类
 */
@Service
public class NiiFileService {

    private static final Logger log = LoggerFactory.getLogger(NiiFileService.class);
    @Autowired
    FileStorageService fileStorageService;
    @Autowired
    MriImagesService mriImagesService;
    @Autowired
    UploadService uploadService;

    @Value("${fileBaseUrl}")
    private String fileBaseUrl;

    /**
     * 对获取到的nii进行处理（旧版，不适用于消息队列）
     * @param file
     */
    public void processNiiFile(MultipartFile file, String seed, String pathName) {
        try {
            // 将.nii文件转存到临时文件中，nii_path
            Path niiDest = TempFileUtil.createTempFile("temp", ".nii");
            file.transferTo(niiDest);
            // 创建临时的目录文件，用于存储PNG文件,output_dir
            Path pngDest = TempFileUtil.createTempDir("png");
            // 处理nii文件，并且输出到临时路径中
            ScriptUtil.executePythonScript("nii_process", niiDest.toString(), pngDest.toString());

            // TODO 将获取到的.nii文件上传到OSS并且存储至数据库
            uploadService.uploadPngFileSingle(pngDest, seed, pathName);
            // 删除临时目录中的nii文件
            TempFileUtil.deleteTempPath(niiDest);
        } catch (Exception e) {
            throw new RuntimeException("文件处理失败：" + e);
        }
    }

    /**
     * 对获取到的nii进行处理（新版，适用于消息队列）
     *
     */
    public void processNiiFile(Path filePath, String seed, String pathName) {
        try {
            // 临时目录存储 PNG 文件
            Path pngDest = TempFileUtil.createTempDir("png");

            // 调用 Python 脚本处理 Nii 文件
            ScriptUtil.executePythonScript("nii_process", filePath.toString(), pngDest.toString());

            // 将处理后的 PNG 文件上传到 OSS
            uploadService.uploadPngFileSingle(pngDest, seed, pathName);

            // 删除临时文件和目录
//            TempFileUtil.deleteTempPath(filePath);
//            TempFileUtil.deleteTempPath(pngDest);
        } catch (Exception e) {
            throw new RuntimeException("文件处理失败：" + e.getMessage());
        }
    }

    /**
     * 拟合模型
     * @param
     */
    public void modelFitting(Path filePath, String seed) {
        try{
            // 调度我们的jar包
            Getfdfeatures features = new Getfdfeatures();
            /**
             * 使用runfdfeatures方法提取参数
             * 方法为runfdfeatures
             * 三个参数，分别为TargetDir(nii文件夹)，ROILTagetDir(左海马体掩模图像)，ROIRTargetDir(右海马体掩模图像)
             * 输出位置为user.dir路径中的datas.csv
             */
            // 提取模型

            // 注意：给到runfdfeatures的第一个参数必须为一个文件夹地址
            features.runfdfeatures(filePath.toFile().getParent().toString()+"\\", MATLABConstants.ROIL_TARGER_DIR, MATLABConstants.ROIR_TARGET_DIR);

//            features.runfdfeatures(MATLABConstants.TARGET_DIR, MATLABConstants.ROIL_TARGER_DIR, MATLABConstants.ROIR_TARGET_DIR);
            log.info("datas.csv输出完成");
            // 使用python脚本根据获取到的文件拟合数据得出标签，获取到标签
            String label = ScriptUtil.executePythonScript("excute_the_features");
            log.info(label);
            mriImagesService.updateBySeed(seed, label);
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage());
        }
    }



    /**
     * 将png文件上传到OSS中，并且返回OSS中存储的URL，单个文件上传
     * @param pngDest
     * @return
     */
    public String uploadPngToOSSAsSingle(Path pngDest) throws IOException {
        File rootDirectory = new File(pngDest.toString());
        if (rootDirectory.exists() && rootDirectory.isDirectory()) {
            File[] directorys = rootDirectory.listFiles();
            for (File directory: directorys) {
                File[] files = directory.listFiles();
                if (files!=null) {
                    for (File file: files) {
                        if (file.isFile()) {
//                            (new UploadService()).uploadPngFileSingle(file);
                        }
                    }
                }
            }
        }
        TempFileUtil.deleteTempPath(pngDest);
        return null;
    }

    /**
     * 根据imageId获取到nii文件的路径
     * @param NiiId
     * @return
     */
    public String getNiiURL(Integer NiiId) {
        try {
            String realPath = mriImagesService.selectById(NiiId).getImagePath();
            return OSSUtil.getOSSURL() + realPath;
        } catch (Exception e) {
            throw new CustomException("路径错误");
        }
    }

    /**
     * 生成png文件名的函数，并存到数据库
     * @param niiFileName
     * @return
     */
    public List<List<String> > saveGeneratePngs(String niiFileName, String seed) {
        List<List<String> > res = new ArrayList<>();
        String[] views = {"Axial", "Coronal", "Sagittal"}; // 三种视图
        int startIndex = 1;
        int endIndex = 121;

        // 遍历每个视图并生成文件名
        for (String view : views) {
            List<String> temp = new ArrayList<>();
            for (int i = startIndex; i <= endIndex; i++) {
                // 格式化数字为3位数，前面补零
                String formattedIndex = String.format("%03d", i);
                // 拼接文件名
                String fileName = fileBaseUrl + "/files/download/" + seed + "_" + niiFileName + "_" + view + "_" + formattedIndex + ".png";
                //TODO：将文件名保存为数据库记录
                temp.add(fileName);
            }
            res.add(temp);
        }
        return res;
    }
}
